package loggers

import (
	"os"
	"sync"

	"gitee.com/chuanjinge/go-container/pkg/dirfile"
)

type OverwriteWriter struct {
	file     *os.File
	filePath string
	mu       sync.Mutex // 确保线程安全
}

func NewOverwriteWriter(filePath string) (*OverwriteWriter, error) {
	if err := dirfile.EnsureDirExists(filePath); err != nil {
		return nil, err
	}
	file, err := os.OpenFile(filePath, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0644)
	if err != nil {
		return nil, err
	}
	return &OverwriteWriter{
		file:     file,
		filePath: filePath,
	}, nil
}

func (ow *OverwriteWriter) Write(p []byte) (n int, err error) {
	ow.mu.Lock()
	defer ow.mu.Unlock()

	// 每次写入前清空文件。
	err = ow.file.Truncate(0)
	if err != nil {
		return 0, err
	}

	// 移动文件指针到文件开头。
	_, err = ow.file.Seek(0, 0)
	if err != nil {
		return 0, err
	}

	// 写入数据。
	n, err = ow.file.Write(p)
	if err != nil {
		return n, err
	}
	ow.file.Sync() // 确保每次写入后都刷新文件，因为我们这是写运行信息，不能等到进程结束后统一flush。

	return n, nil
}

func (ow *OverwriteWriter) Sync() error {
	ow.mu.Lock()
	defer ow.mu.Unlock()
	return ow.file.Sync()
}

func (ow *OverwriteWriter) Close() error {
	ow.mu.Lock()
	defer ow.mu.Unlock()
	return ow.file.Close()
}
